package com.example.spring_transaction.controller;

import com.example.spring_transaction.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @className: TestController3
 * @author: 芃
 * @description: 事务的传播属性
 * @date: 2024/12/30 18:57
 */
@RestController
@RequestMapping("/test4")
public class TestController4 {
    @Autowired
    private UserService userService;

    /**
     * Service调用Service情况下，有可能出现事务嵌套
     * 事务嵌套：指的是一个大的事务中，包含了若干个小的事务
     * 问题：大事务中融入了很多小的事务，他们彼此影响，最终就会导致外部大的事务，丧失了事务的原子性
     */

    /**
     * 传播属性的值及其用法：
     * @Transactional(propagation = Propagation.传播属性的值
     * 传播属性的值          外部不存在事务          外部存在事务
     * REQUIRED            开启新的事务            融合到外部事务中 >主要应用于增删改   默认的传播属性
     * SUPPORTS            不开启新的事务          融合到外部事务中  ->主要应用于查询
     * REQUIRES_NEW        开启新的事务           挂起外部事务，创建新的事务 ->主要用于非核心业务类代码的传播属性，比如记录操作日志的功能，不管外部事务的执行结果如何，记录日志必然是要记录的，同理，不管记录日志的操作结果如何，不能影响到外部事务的整体运行
     * NOT_SUPPORTED       不开启新的事务          挂起外部事务 ->总而言之就一句话，不支持事务，举个例子，查询上一条操作记录，非核心业务，仅查询操作日志
     * NEVER               不开启新的事务          抛出异常 ->在非事务情况下执行的功能
     * MANDATORY           抛出异常               融合到外部事务中 ->必须得有事务
     */

    /**
     * 只读属性：readOnly
     * 针对于只进行查询操作，可以加入只读属性，提高运行效率
     * 只读属性默认值是false，需要设置 readOnly=true
     */

    /**
     * 超时属性：timeout ->指定了事务等待的最长时间
     * 当前事务访问数据时，有可能访问的数据被别的事务进行枷锁的处理，那么此时本事务就必须进行等待了
     * 超时属性就是为了防止无休止的等待下去，以防持有锁的事务内部发声不可预期的错误导致死循环or其他情况
     * 等待时间 秒
     * @Transactional（timeout=2)
     */

    /**
     * 异常属性：
     */

    @RequestMapping("/addUser")
    public Integer addUser(String userName,String password){
        return userService.addUser(userName,password);
    }


}
